//1.引入node.js内置用来创建 http服务器的模块
const http = require('http');
//2.创建http服务器，指定请求处理函数，以后每当有客户端请求到达服务器的时候就会由此
//请求处理函数来处理请求，并返回响应
//req代表请求对象，如果 想获取请求信息比如请求行 METHOD url 请求头 请求体可以使用此对象
//res代表响应对象，如果想写入响应信息，比如状态码 响应头 响应体使用此对象 
http.createServer((req, res) => {
    //服务器返回一个响应头，以后如果是来自于5500的访问，则浏览器不会再进行阻止
    res.setHeader('Access-Control-Allow-Origin', 'http://127.0.0.1:5500');
    //在预览的时候，需要返回响应头
    res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
    //在预检的时候，需要返回响应头Allow-Methods，它的值就是允许跨域请求的方法
    res.setHeader('Access-Control-Allow-Methods', 'PUT');
    //允许跨域的时候携带cookie
    res.setHeader('Access-Control-Allow-Credentials','true')
    //如果客户端发送过来的是一个OPTIONS请求的话，说明客户端只是需要确认一下是否允许跨域
    //它需要判断是否有Access-Control-Allow-Origin就可以了，不需要响应体
    if (req.method === 'OPTIONS') {
        res.statusCode = 200;
        return res.end();
    }
    if (req.url === '/') {
        res.end('home');
    } else if (req.url === '/users') {
        switch (req.method) {
            case 'GET':
                res.end('users');
                break;
            case 'POST':
                res.end('POST /users');
                break;
            case 'PUT':
                res.end('PUT /users');
                break;
            default:
                break;
        }
        //当客户端访问/visit路径的时候
    }else if(req.url === '/visit'){
        //取出客户端传递过来的cookie
        const cookies = req.headers.cookie;
        console.log('cookies',cookies);
        //定义一个客户端访问次数的变量
        let visit =0;
        if(cookies){// key1=value1;  visit=1;key3=value3
            //先用分割符把cookie拆成字符串的数组，然后再循环此字符串数组
            let items = cookies.split(/;\s+/);
            for(let i=0;i<items.length;i++){
                //再用=对每个cookie进行分割,会返回一个数组 1项 key 2项 value
                let [key,value] = items[i].split('=');
                if(key === 'visit'){
                    visit=Number(value)
                    break;
                }
            }
        }
        //让访问次数加1
        visit++;
        //服务器通过响应头Set-Cookie向客户端种植cookie visit=2
        //SameSite 是否只允许同域或者说同站点访问， 只有把它设置为None才能允许跨域读写cookie 
        //Secure为true的话表示只允许在https站点生效
        res.setHeader('Set-Cookie',[`visit=${visit}; SameSite=None; Secure=false`]);
        //返回最新的访问次数
        res.end(`${visit}`);
    } else {
        res.statusCode = 404;
        //即使你没有向客户端写入响应体，也需要关闭响应，
        //不然客户端会一直在等待服务器的响应，一直在那里转圈圈 
        res.end();
    }
}).listen(8080, () => console.log('8080'));